﻿using System;
using System.IO;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Recomendaciones.Entidades;
using Recomendaciones.AccesoADatos;

//Agregado 1-12. Se agregaró la biblioteca IO, la funcion MovePhoto, las constantes que están unos renglones abajo y se modificó el actualizar e insertar.

/// <summary>
/// Descripción breve de RestaurantServices
/// </summary>
public class RestaurantServices
{
    Ado _ado;
    private const string _photoDirectory = @"\Imagenes\Restaurants\";
    private const string _photoDirectoryTemp = @"\Imagenes\temp\";
    private const string _defaultPhoto = @"Restaurant-default.jpg";

    #region Constructor y Destructor
    public RestaurantServices()
    {
        _ado = new Ado();
    }

    ~RestaurantServices()
    {
        _ado = null;
    }
    #endregion

    private string MovePhoto(string photo)
    {
        try
        {
            var sourceFilePath = AppDomain.CurrentDomain.BaseDirectory + _photoDirectoryTemp + Path.GetFileName(photo);
            var destFilePathShort = _photoDirectory + Path.GetFileName(photo);
            var count = 1;

            while (File.Exists(AppDomain.CurrentDomain.BaseDirectory + destFilePathShort))
            {
                destFilePathShort = _photoDirectory + Path.GetFileNameWithoutExtension(photo) + "(" + count++ + ")" + Path.GetExtension(photo);
            }
            File.Move(sourceFilePath, AppDomain.CurrentDomain.BaseDirectory + destFilePathShort);
            return destFilePathShort.Replace('\\', '/');
        }
        catch { return null; }
    }

    public List<Restaurant> ObtenerTopTen()
    {
        try
        {
            _ado.EjecutarStoredProcedureDataReader("Restaurant_ObtenerTopTen");
            DataTable restaurants = _ado.DevolverDatosRapido();
            return (List<Restaurant>)CollectionHelper.ConvertTo<Restaurant>(restaurants);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public Restaurant ObtenerPorId(string id)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(Convert.ToInt32(id));
            _ado.EjecutarStoredProcedureDataReader("Restaurant_ObtenerPorId", parametros);
            DataTable restaurants = _ado.DevolverDatosRapido();

            //Solo devolvemos el primer elemento del list porque al buscar por id obtendremos un solo resultado//
            return ((List<Restaurant>)CollectionHelper.ConvertTo<Restaurant>(restaurants))[0];
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string InsertarRestaurant(string categoria_id, string usuario_id, string localidad_id, string provincia_id, string nombre, string direccion, string telefono, string horario, string imagen, string resumen)
    {
        try
        {

            if (String.IsNullOrEmpty(nombre) || nombre.Length > 60 || !esAlfanumerico(nombre))
                return "Nombre invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(direccion) || direccion.Length > 60 || !esAlfanumerico(direccion))
                return "Direccion invalida";
            if (String.IsNullOrEmpty(telefono) || telefono.Length > 20 || !esTelefono(telefono))
                return "Telefono invalido";
            if (String.IsNullOrEmpty(horario) || horario.Length > 35 || !esAlfanumerico(horario))
                return "Horario invalido";
            if (String.IsNullOrEmpty(categoria_id) || !esNumero(categoria_id))
                return "Categoria invalida";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";
            if (String.IsNullOrEmpty(localidad_id) || !esNumero(localidad_id))
                return "Localidad invalida";
            if (String.IsNullOrEmpty(provincia_id) || !esNumero(provincia_id))
                return "Provincia invalida";

            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(10);
            parametros.Add(Convert.ToInt32(categoria_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(Convert.ToInt32(localidad_id));
            parametros.Add(Convert.ToInt32(provincia_id));
            parametros.Add(nombre);
            parametros.Add(direccion);
            parametros.Add(telefono);
            parametros.Add(horario);
            parametros.Add(imagen);
            parametros.Add(resumen);

            _ado.EjecutarStoredProcedureDataReader("Restaurant_Insertar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string ActualizarRestaurant(string restaurant_id, string categoria_id, string usuario_id, string localidad_id, string provincia_id, string nombre, string direccion, string telefono, string horario, string imagen, string resumen)
    {
        try
        {
            if (String.IsNullOrEmpty(nombre) || nombre.Length > 60 || !esAlfanumerico(nombre))
                return "Nombre invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(direccion) || direccion.Length > 60 || !esAlfanumerico(direccion))
                return "Direccion invalida";
            if (String.IsNullOrEmpty(telefono) || telefono.Length > 20 || !esTelefono(telefono))
                return "Telefono invalido";
            if (String.IsNullOrEmpty(horario) || horario.Length > 35 || !esAlfanumerico(horario))
                return "Horario invalido";
            if (String.IsNullOrEmpty(categoria_id) || !esNumero(categoria_id))
                return "Categoria invalida";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";
            if (String.IsNullOrEmpty(localidad_id) || !esNumero(localidad_id))
                return "Localidad invalida";
            if (String.IsNullOrEmpty(provincia_id) || !esNumero(provincia_id))
                return "Provincia invalida";
            if (String.IsNullOrEmpty(restaurant_id) || !esNumero(restaurant_id))
                return "Restaurant invalido";

            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(11);
            parametros.Add(Convert.ToInt32(restaurant_id));
            parametros.Add(Convert.ToInt32(categoria_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(Convert.ToInt32(localidad_id));
            parametros.Add(Convert.ToInt32(provincia_id));
            parametros.Add(nombre);
            parametros.Add(direccion);
            parametros.Add(telefono);
            parametros.Add(horario);
            parametros.Add(imagen);
            parametros.Add(resumen);

            _ado.EjecutarStoredProcedureDataReader("Restaurant_Actualizar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string EliminarRestaurant(string id)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(Convert.ToInt32(id));
            _ado.EjecutarStoredProcedureDataReader("Restaurant_EliminarPorId", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public List<CategoriaRestaurant> ObtenerCategorias()
    {
        try
        {
            _ado.EjecutarStoredProcedureDataReader("Restaurant_ObtenerCategorias");
            DataTable categorias = _ado.DevolverDatosRapido();

            return (List<CategoriaRestaurant>)CollectionHelper.ConvertTo<CategoriaRestaurant>(categorias);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    #region Validaciones

    private bool esAlfanumerico(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[\\w.,: áéíóúÁÉÍÓÚñÑ]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esNumero(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[0-9]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esTelefono(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^([0-9]{4}-[0-9]{4})|([0-9]{2}-[0-9]{4}-[0-9]{4})$");
        return regExobj.IsMatch(cadena);
    }

    #endregion

}
